#include "wx/wxprec.h"
#if wxUSE_COLOURPICKERCTRL || \
wxUSE_DIRPICKERCTRL    || \
wxUSE_FILEPICKERCTRL   || \
wxUSE_FONTPICKERCTRL

#include "wx/pickerbase.h"
#include "wx/tooltip.h"

#ifndef WX_PRECOMP
#include "wx/textctrl.h"
#endif


// ============================================================================
// implementation
// ============================================================================

IMPLEMENT_ABSTRACT_CLASS( wxPickerBase, wxControl )

BEGIN_EVENT_TABLE( wxPickerBase, wxControl )
  EVT_SIZE( wxPickerBase::OnSize )
  WX_EVENT_TABLE_CONTROL_CONTAINER( wxPickerBase )
END_EVENT_TABLE()
WX_DELEGATE_TO_CONTROL_CONTAINER( wxPickerBase, wxControl )


// ----------------------------------------------------------------------------
// wxPickerBase
// ----------------------------------------------------------------------------

bool wxPickerBase::CreateBase( wxWindow *parent,
                               wxWindowID id,
                               const wxString &text,
                               const wxPoint& pos,
                               const wxSize& size,
                               long style,
                               const wxValidator& validator,
                               const wxString& name ) {
  style &= ~wxBORDER_MASK;
  if( !wxControl::Create( parent, id, pos, size, style | wxNO_BORDER | wxTAB_TRAVERSAL,
                          validator, name ) ) {
    return false;
  }
  m_sizer = new wxBoxSizer( wxHORIZONTAL );
  if( HasFlag( wxPB_USE_TEXTCTRL ) ) {
    m_text = new wxTextCtrl( this, wxID_ANY, wxEmptyString,
                             wxDefaultPosition, wxDefaultSize,
                             GetTextCtrlStyle( style ) );
    if( !m_text ) {
      wxFAIL_MSG( wxT( "wxPickerBase's textctrl creation failed" ) );
      return false;
    }
    m_text->SetMaxLength( 32 );
    m_text->SetValue( text );
    m_text->Connect( m_text->GetId(), wxEVT_COMMAND_TEXT_UPDATED,
                     wxCommandEventHandler( wxPickerBase::OnTextCtrlUpdate ),
                     NULL, this );
    m_text->Connect( m_text->GetId(), wxEVT_KILL_FOCUS,
                     wxFocusEventHandler( wxPickerBase::OnTextCtrlKillFocus ),
                     NULL, this );
    m_text->Connect( m_text->GetId(), wxEVT_DESTROY,
                     wxWindowDestroyEventHandler( wxPickerBase::OnTextCtrlDelete ),
                     NULL, this );
    m_sizer->Add( m_text, 2, GetDefaultTextCtrlFlag(), 5 );
  }
  return true;
}

void wxPickerBase::PostCreation() {
  m_sizer->Add( m_picker, HasTextCtrl() ? 0 : 1, GetDefaultPickerCtrlFlag(), 5 );
  SetSizer( m_sizer );
  SetMinSize( m_sizer->GetMinSize() );
}

#if wxUSE_TOOLTIPS

void wxPickerBase::DoSetToolTip( wxToolTip *tip ) {
  // don't set the tooltip on us but rather on our two child windows
  // as otherwise it would appear only when the cursor is placed on the
  // small area around the child windows which belong to wxPickerBase
  m_picker->SetToolTip( tip );
  // do a copy as wxWindow will own the pointer we pass
  if( m_text ) {
    m_text->SetToolTip( tip ? new wxToolTip( tip->GetTip() ) : NULL );
  }
}

#endif // wxUSE_TOOLTIPS

// ----------------------------------------------------------------------------
// wxPickerBase - event handlers
// ----------------------------------------------------------------------------

void wxPickerBase::OnTextCtrlKillFocus( wxFocusEvent& event ) {
  event.Skip();
  // don't leave the textctrl empty
  if( m_text && m_text->GetValue().empty() ) {
    UpdateTextCtrlFromPicker();
  }
}

void wxPickerBase::OnTextCtrlDelete( wxWindowDestroyEvent & ) {
  // the textctrl has been deleted; our pointer is invalid!
  m_text = NULL;
}

void wxPickerBase::OnTextCtrlUpdate( wxCommandEvent & ) {
  // for each text-change, update the picker
  UpdatePickerFromTextCtrl();
}

void wxPickerBase::OnSize( wxSizeEvent &event ) {
  if( GetAutoLayout() ) {
    Layout();
  }
  event.Skip();
}

#endif // Any picker in use
